<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // Symbol

    // 起源:ES5 的对象属性名都是字符串，这容易造成属性名的冲突。比如，你使用了一个他人提供的对象，但又想为这个对象添加新的方法（mixin 模式），新方法的名字就有可能与现有方法产生冲突

    // 如果有一种机制，保证每个属性的名字都是独一无二的就好了，这样就从根本上防止属性名的冲突。这就是 ES6 引入Symbol的原因。

    // ES6 引入了一种新的原始数据类型Symbol，表示独一无二的值。它属于 JavaScript 语言的原生数据类型之一，其他数据类型是：undefined、null、布尔值（Boolean）、字符串（String）、数值（Number）、大整数（BigInt）、对象（Object）。

    // Math => 数学对象
    // Math.random()
    // Math.round()
    // Math.ceil()
    // Math.floor()
    // Math.min()
    // Math.max()
    // Math.abs()
    // Math.sin()
    // Math.cos()
    // Math.tan()
    // Math.PI

    // 给Math对象定义一个方法(我们自己定义)
    /* Math.randInt = function (min, max) {
        if (!(typeof min == "number" && min % 1 == 0)) {
            var err = new Error("Parameter 1 must be an integer!");  //错误对象
            throw err;  // 抛出错误之后 当前脚本之后的代码不执行
        }
        if (!(typeof max == "number" && max % 1 == 0)) {
            var err = new Error("Parameter 2 must be an integer!");  //错误对象
            throw err;
        }

        if (min > max) {
            var err = new Error("Parameter 1 must be smaller than Parameter 2!");  //错误对象
            throw err;
        }

        return min + Math.round(Math.random() * (max - min));
    }

    // var result = Math.randInt("1", "100");
    // var result = Math.randInt(1, "100");
    var result = Math.randInt(1, 100);
    console.log(result); */



    // 如何创建Symbol数据?
    // Symbol 值通过Symbol()函数生成。  => 表示独一无二的值。
    // var s1 = Symbol();
    // console.log(s1, typeof s1);

    // var s2 = Symbol();
    // console.log(s2, typeof s2);

    // console.log(s1 === s2);  // false

    // Symbol()函数可以接受一个字符串作为参数，表示对 Symbol 实例的描述。这主要是为了在控制台显示，或者转为字符串时，比较容易区分。

    // var s1 = Symbol("a");
    // console.log(s1, typeof s1);

    // var s2 = Symbol("b");
    // console.log(s2, typeof s2);

    // console.log(s1 === s2);  // false

    // 转字符串
    // console.log(s1.toString());
    // console.log(s2.toString());

    // 获取 Symbol 数据的描述(描述)
    // console.log(s1.description);
    // console.log(s2.description);


    // Symbol应用:
    // 1. 表示独一无二的值
    // 2. 对象的属性名现在可以有两种类型，一种是原来就有的字符串，另一种就是新增的 Symbol 类型。凡是属性名属于 Symbol 类型，就都是独一无二的，可以保证不会与其他属性名产生冲突。





</script>

</html>